package 基础;

定时任务的cron表达式 

我们就从一个简单的cron表达式例子开始，cron = 0 0 2 * * ? ，这个表达式的含义是每天凌晨两点执行一次任务。可以看到cron表达式是一个字符串，以5或者6个空格
隔开(示例中是被5个空格隔开)。字符串被切割为6个或者7个域，每个域都代表不同的含义。从左到右依次为"秒 分 时 日 月 星期几 年" ，其中年不是必须的的，所以cron表
达式有两种形式：

{Seconds} {Minutes} {Hours} {DayofMonth} {Month} {DayofWeek} {Year}或
{Seconds} {Minutes} {Hours} {DayofMonth} {Month} {DayofWeek}
各个域的含义如下：
域     字段          取值          特殊字符
秒    Second        0-59         ,-*/
分    Minutes       0-59         ,-*/
时    Hours         0-23         ,-*/
日    DayofMonth    1-31         ,-*/?LW  1~31的整数（但是你需要考虑你月的天数）	,- * ? / L W C     八个字符
月    Month      1-12或JAN-DEC    ,-*/
星期几 DayofWeek  1-7或SUN-SAT     ,-*/?L#
年    Year       1970-2099       ,-*/

每个域都可以用数字表示，但是还可以出现如下特殊字符。

* : 表示匹配该域的任意值。比如Minutes域使用*，就表示每分钟都会触发。
- : 表示范围。比如Minutes域使用 10-20，就表示从10分钟到20分钟每分钟都会触发一次。
, : 表示列出枚举值。比如Minutes域使用1,3，就表示1分钟和3分钟都会触发一次。
/ : 表示间隔时间触发(开始时间/时间间隔)。例如在Minutes域使用 5/10，就表示从第5分钟开始，每隔10分钟触发一次。
? : 表示不指定值。简单理解就是忽略该字段的值，直接根据另一个字段的值触发执行。
# : 表示该月第n个星期x(x#n)，仅用星期域。如：星期：6#3，表示该月的第三个星期五。
L : 表示最后，是单词"last"的缩写（最后一天或最后一个星期几）；仅出现在日和星期的域中。用在日则表示该月的最后一天，用在星期则表示该月的最后一个星期。
    如：星期域上的值为5L，则表示该月最后一个星期的星期四。在使用'L'时，不要指定列表','或范围'-'，否则易导致出现意料之外的结果。
W:  仅用在日的域中，表示距离当月给定日期最近的工作日（周一到周五），是单词"weekday"的缩写。比如："4W"表示距离4号最近的工作日（当月的）触发；
    （1）当4号就是工作日时，则表示当天触发；当4号为周六时，则表示3号（周五）触发；
    （2）当4号为周日时，则表示在5号（周一）触发；
    比如："1W"表示距离1号最近的工作日触发事件，但是，该工作日只算当月的。假如当月1号是周六，则"1W"表示在当月3号（周一）触发。就算上个月的最后一天是工作日，
    也不会触发。
LW: ‘L’和'W'可以一起组合在日字段使用。表示当月的最后一个工作日触发事件。

取值说明:

DayofMonth：可以用数字1-31 中的任一个值，但要注意一些特别的月份。

Month：一年中的月份，可以用0-11 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示。

DayofWeek：表示星期几，可以用数字1-7（1=星期日），或者用字符串"SUN, MON, TUE, WED, THU, FRI and SAT"来表示。

常用cron表达式:
*/10 * * * * ? 每隔10秒执行一次

0 */5 * * * ? 每隔5分钟执行一次

0 2,22,32 * * * ? 在2分、22分、32分执行一次

0 0 4-8 * * ? 每天4-8点整点执行一次

0 0 2 * * ? 每天凌晨2点执行一次

0 0 2 1 * ? 每月1号凌晨2点执行一次

cron表达式生成器
现在也有许多在线的cron表达式生成器：

https://cron.qqe2.com/

http://www.toolzl.com/tools/croncr